-- cmd_login_aaa
-- Create by panyl
-- 玩家登录aaa服务器请求验证

-- 内部函数声明
local onAuthOk
local onAuthFail;
local onConnected;
local onConnectFail;

function Operation.cmd_login_aaa(account, password, ip, port, version, extraPara)
    if true ~= AccountM.checkAccount(account) then
        -- 没有通过验证
        return
    end

    LoginM.set_login_stage(LOGIN_STATUS_AAA_1);

    -- 去掉账号头尾空格
    account = AccountM.removeSpace(account);

    trace("cmd_login_aaa", "帐号(%s)登录aaa服务器 ip：(%s) port (%d) ", account, ip, port);

    -- 当前是连接状态
    if Socket.isConnected() or Socket.isConnecting() then
        -- TODO: 需要返回错误码
        cclog("正在连接服务器，请稍候！")
        return
    end

    cclog("正在连接服务器...")

    -- 记录下客户端的平台和设备信息
    extraPara["client_os"] = getPlatformName();
    extraPara["device"] = getDeviceInfo();

    -- 记录下mac地址
    local macAddress = NetworkStatus.getMacAddress();

    extraPara["mac_address"] = macAddress;

    extraPara["client_version"] = CLIENT_VERSION;

    -- 记录信息
    _G.aaaAccountInfo = {
        ["account"]  = account,
        ["password"] = MyRc4.encrypt(password,"7777777"),
        ["version"]  = version,
        ["extra_para"] = extraPara,
    }

    if fixHostname then
        ip = fixHostname(ip);
    end

    _G.ip = ip;
    _G.port = port;

    -- 移除事件的关注
    EventMgr.remove("cmd_login_aaa", event.NETWORK_CONNECTED)
    EventMgr.remove("cmd_login_aaa", event.NETWORK_DISCONNECTED)

    -- 关注事件
    EventMgr.register("cmd_login_aaa", event.NETWORK_CONNECTED, onConnected);
    EventMgr.register("cmd_login_aaa", event.NETWORK_DISCONNECTED, onConnectFail);

    -- 连接服务器
    Socket.connect(ip, port);

    -- 处理完成
    return true;
end

-- 连接服务器成功后的处理
onConnected = function()
    -- 移除事件的关注
    EventMgr.remove("cmd_login_aaa", event.NETWORK_CONNECTED)
    EventMgr.remove("cmd_login_aaa", event.NETWORK_DISCONNECTED)

    LoginM.set_login_stage(LOGIN_STATUS_AAA_2);

    local v = _G.aaaAccountInfo

    -- 发送auth指令
    Operation.cmd_internal_auth(CFG_TYPE_CONSOLE, v.account, CFG_AAA_LOGIN);

    cclog("发送验证完毕，发送登录请求。\n");

    -- 发送登录指令
    trace("cmd_login_aaa", "发送登录消息");
    Communicate.send("CMD_AUTH_ACCOUNT", v);

    -- 等待消息到达
    -- MSG.waitMessageArrival("MSG_AUTH_ACCOUNT_RESULT", function(para)
    --     if para.result ~= LOGIN_AUTH_OK then
    --         -- TODO: 验证未成功，断开连接
    --         trace("cmd_login_aaa", "验证失败");
    --         Socket.disconnect()
    --         return
    --     end

    --     -- 获取服务器
    --     trace("cmd_login_aaa", "获取服务器");
    --     Communicate.send("CMD_L_GET_SERVER_LIST", {});
    -- end, 15)
end

-- 连接失败的处理
onConnectFail = function()
    trace("cmd_login_aaa", "登录失败了");

    -- 移除事件的关注
    EventMgr.remove("cmd_login_aaa", event.NETWORK_CONNECTED)
    EventMgr.remove("cmd_login_aaa", event.NETWORK_DISCONNECTED)
end
